//lodash中的组合函数

function compose(...args) {
  //这里的value是后面调用时传入的值
  console.log(args);
  // [[(Function: toUpper)], [(Function: first)], [(Function: reverse)]];
  return function (value) {
    //reduce(callback,初始值)按照我们提供的函数执行---callback(值的集合,单个值)
    //因为flowRight是从右到左执行的所以需要reverse数组方法将方法翻转
    return args.reverse().reduce(function (acc, fn) {
      //   acc代表值的汇总
      //fn代表传入的每个值
      return fn(acc);
    }, value);
    //   value 代表acc的初始值,也就是后面r传入的数组参数
  };
}
//es6写法
const compose_es6 = (...args) => (value) =>
  args.reverse().reduce((acc, fn) => fn(acc), value);

const reverse = (arr) => arr.reverse();
const first = (arr) => arr[0];
const toUpper = (s) => s.toUpperCase();

const r = compose(toUpper, first, reverse);

const r_es6 = compose_es6(toUpper, first, reverse);
console.log(r(["one", "two", "three"])); //THREE
console.log(r_es6(["one", "two", "three"])); //THREE
